home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Games / ADoomPPC / src / doomsound.library.s < prev    next >
Encoding:
Text File  |  1998-03-29  |  50.1 KB  |  2,402 lines

  1. ;------------------------------------------------------------------------
  2. ; Sound Library for DOOM - by Joseph Fenton
  3. ;
  4. ; Functions:
  5. ;    Sfx_SetVol - pass in the new sound effects volume in d0.
  6. ;    Sfx_Start - pass in new sound effect to play. a0 = wave,
  7. ;        d0 = cnum, d1 = pitch, d2 = vol, d3 = sep, d4 =
  8. ;        length.
  9. ;    Sfx_Update - pass in new settings for a sfx. a0 = data,
  10. ;        d0 = cnum, d1 = pitch, d2 = vol, d3 = sep.
  11. ;    Sfx_Stop - stop a playing sound effect. d0 = cnum.
  12. ;    Sfx_Done - check if sound effect playing. d0 = cnum; returns
  13. ;        d0 = 0 if not playing/current index if playing.
  14. ;    Mus_SetVol - pass in the new music volume in d0.
  15. ;    Mus_Register - pass in pointer to MUS data to register in
  16. ;        a0. Returns handle in d0.
  17. ;    Mus_Unregister - pass in handle to music to unregister in d0.
  18. ;    Mus_Play - pass in handle to music to start playing in d0,
  19. ;        pass the looping flag in d1.
  20. ;    Mus_Stop - pass in handle to music to stop playing in d0.
  21. ;    Mus_Pause - pass in handle to music to pause in d0.
  22. ;    Mus_Resume - pass in handle to music to resume in d0.
  23. ;    Mus_Done - return d0 = 0 if music not playing
  24. ;
  25. ;------------------------------------------------------------------------
  26.  
  27.  
  28. _custom        equ    $DFF000
  29.  
  30. ;------------------------------------------------------------------------
  31.  
  32.         include    devpac:system.gs    ; all includes/LVOs
  33.  
  34. ;        include    "exec/exec.i"
  35. ;        include    "exec/funcdef.i"
  36. ;        include    "exec/exec_lib.i"
  37. ;        include    "dos/dos.i"
  38. ;        include    "dos/dos_lib.i"
  39. ;        include    "graphics/gfxbase.i"
  40. ;        include    "devices/audio.i"
  41. ;        include    "hardware/custom.i"
  42. ;        include    "hardware/intbits.i"
  43. ;        include    "hardware/dmabits.i"
  44. ;
  45. ;CALLSYS        macro
  46. ;        jsr    (_LVO\1,a6)
  47. ;        endm
  48. ;
  49. ;CALLDOS        macro
  50. ;        movea.l    (_DOSBase,pc),a6
  51. ;        jsr    (_LVO\1,a6)
  52. ;        endm
  53.  
  54.         output    libs:doomsound.library
  55.  
  56. ;------------------------------------------------------------------------
  57.  
  58. VERSION        equ 37            ;Version #
  59. REVISION    equ 0            ;revision of the version
  60.  
  61. _VER        equ (VERSION/10)
  62. VERHIGH        equ _VER|$30
  63. VERLOW        equ (VERSION-(_VER*10))|$30
  64. _REV        equ (REVISION/10)
  65. REVHIGH        equ _REV|$30
  66. REVLOW        equ (REVISION-(_REV*10))|$30
  67.  
  68. OUTPUT_VER    MACRO
  69.         ifge VERHIGH-$31
  70.         dc.b VERHIGH
  71.         endc
  72.         dc.b VERLOW
  73.         dc.b '.'
  74.         ifge REVHIGH-$31
  75.         dc.b REVHIGH
  76.         endc
  77.         dc.b REVLOW
  78.         ENDM
  79.  
  80. OUTPUT_DATE    MACRO
  81.         dc.b ' (29.3.98)'
  82.         ENDM
  83.  
  84.  
  85. ;--------------------------------------------------------------------
  86. ; in case of idiots
  87.  
  88.         moveq    #0,d0
  89.         rts
  90.  
  91. ;--------------------------------------------------------------------
  92. ; standard library header
  93.  
  94.  
  95. InitDescript    dc.w    $4AFC        ;this is the magic cookie
  96.         dc.l    InitDescript
  97.         dc.l    EndCode        ;end of code to checksum
  98.         dc.b    RTF_AUTOINIT
  99.         dc.b    VERSION        ;version #
  100.         dc.b    NT_LIBRARY    ;node type (library)
  101.         dc.b    0        ;node priority
  102.         dc.l    Name        ;pointer to the library name
  103.         dc.l    IDString    ;pointer to ID string
  104.         dc.l    Init        ;pointer to initialization data
  105.  
  106.  
  107. Name        dc.b    'doomsound.library',0
  108.         even
  109.  
  110. IDString    dc.b    'doomsound.library '
  111.         OUTPUT_VER
  112.         OUTPUT_DATE
  113.         dc.b    ' ©1998 by Joe Fenton.',0
  114.         even
  115.  
  116.  
  117.         CNOP    0,4
  118.  
  119. Init        dc.l    LIB_SIZE
  120.         dc.l    FuncTable
  121.         dc.l    DataTable
  122.         dc.l    InitRoutine
  123.  
  124.  
  125. FuncTable    dc.l    OpenLib        ; -6
  126.         dc.l    CloseLib    ; -12
  127.         dc.l    Expunge        ; -18
  128.         dc.l    Reserved    ; -24
  129.  
  130.         dc.l    Sfx_SetVol    ; -30
  131.         dc.l    Sfx_Start    ; -36
  132.         dc.l    Sfx_Update    ; -42
  133.         dc.l    Sfx_Stop    ; -48
  134.         dc.l    Sfx_Done    ; -54
  135.  
  136.         dc.l    Mus_SetVol    ; -60
  137.         dc.l    Mus_Register    ; -66
  138.         dc.l    Mus_Unregister    ; -72
  139.         dc.l    Mus_Play    ; -78
  140.         dc.l    Mus_Stop    ; -84
  141.         dc.l    Mus_Pause    ; -90
  142.         dc.l    Mus_Resume    ; -96
  143.         dc.l    Mus_Done    ; -102
  144.  
  145.         dc.l    -1
  146.  
  147.  
  148. DataTable    INITBYTE LN_TYPE,NT_LIBRARY
  149.         INITLONG LN_NAME,Name
  150.         INITBYTE LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
  151.         INITWORD LIB_VERSION,VERSION
  152.         INITWORD LIB_REVISION,REVISION
  153.         INITLONG LIB_IDSTRING,IDString
  154.         dc.l    0
  155.  
  156.  
  157. ;--------------------------------------
  158. ; A0 = library segment list
  159. ; A6 = ExecBase
  160. ; D0 = library pointer
  161. ;
  162. ; D0 -> library base or NULL
  163.  
  164.         CNOP    0,16
  165.  
  166. InitRoutine    move.l    a6,_ExecBase
  167.         move.l    a5,-(a7)        ;save a5
  168.         movea.l    d0,a5            ;library base pointer
  169.         move.l    a0,SegList        ;save library seglist
  170.  
  171.         bsr    InitServer        ;setup sound server
  172.         bne.b    .err
  173.  
  174.         move.l    a5,d0            ;success ...
  175.         movea.l    (a7)+,a5
  176.         rts
  177.  
  178. .err        moveq    #0,d0            ;error
  179.         movea.l    (a7)+,a5
  180.         rts
  181.  
  182.  
  183. ;--------------------------------------
  184.  
  185.         CNOP    0,16
  186.  
  187. OpenLib        addq.w    #1,LIB_OPENCNT(a6)
  188.         move.l    a6,d0
  189.         rts
  190.  
  191.  
  192. ;--------------------------------------
  193. ; this library is auto-expunging
  194.  
  195.         CNOP    0,16
  196.  
  197. CloseLib    subq.w    #1,LIB_OPENCNT(a6)
  198.         beq.b    Expunge
  199. ;still open
  200.         moveq    #0,d0            ;no seglist
  201.         rts
  202.  
  203.  
  204. ;--------------------------------------
  205. ; A6 = library base
  206. ;
  207. ; D0 -> seglist or NULL
  208.  
  209.         CNOP    0,16
  210.  
  211. Expunge        tst.w    LIB_OPENCNT(a6)        ;library still open?
  212.         bne    .LibStillOpen        ;yes
  213.  
  214.         bsr    ExitServer        ;cleanup sound server
  215.  
  216.         IFND    TESTING
  217.         move.l    SegList,d0        ;get the seglist
  218.         movem.l    d0/a5-a6,-(a7)        ;delayed save
  219.         movea.l    a6,a5            ;library base => A5
  220.         movea.l a5,a1            ;library node
  221.         movea.l    _ExecBase,a6
  222.         CALLSYS    Remove            ;unlink msmmu.library
  223.  
  224.         movea.l    a5,a1            ;calculate lib size
  225.         moveq    #0,d0            ;and free memory
  226.         move.w    LIB_NEGSIZE(a5),d0    ;backward extent
  227.         suba.w    d0,a1            ;low memory extent
  228.         add.w    LIB_POSSIZE(a5),d0    ;forward extent
  229.         CALLSYS    FreeMem            ;give it back
  230.         movem.l    (a7)+,d0/a5-a6        ;seglist=>D0
  231.         ENDC
  232.         rts
  233.  
  234.  
  235. .LibStillOpen    moveq    #0,d0            ;no seglist
  236.         rts
  237.  
  238.  
  239. ;--------------------------------------
  240.  
  241.         CNOP    0,4
  242.  
  243. Reserved    moveq.l #0,d0
  244.         rts
  245.  
  246.  
  247. EndCode:
  248.  
  249. ;--------------------------------------------------------------------
  250.  
  251.         dc.b    'This sound library uses the Amiga audio.device and',0
  252.         dc.b    '11KHz samples; it supports full stereo panning on',0
  253.         dc.b    'sound effects and music.  Up to 16 sound effects and',0
  254.         dc.b    '16 channels of music can be palying at any time.',0
  255.  
  256. ;--------------------------------------------------------------------
  257.  
  258.         CNOP    0,16
  259.  
  260. InitServer    movem.l    d1-d7/a0-a6,-(a7)
  261.         movea.l    _ExecBase,a6
  262.  
  263.         moveq    #0,d0
  264.         lea    DOSName,a1
  265.         CALLSYS    OpenLibrary
  266.         move.l    d0,_DOSBase
  267.         beq    .err            ; couldn't open dos.library
  268.  
  269.         moveq    #39,d0
  270.         lea    GfxName,a1
  271.         CALLSYS    OpenLibrary
  272.         tst.l    d0
  273.         beq.b    .2            ; leave at default (NTSC)
  274.         move.l    d0,a1
  275.         btst    #REALLY_PALn,gb_DisplayFlags(a1)
  276.         beq.b    .1            ; crystal is NTSC
  277.         move.w    #322,period        ; PAL sample rate
  278. .1        CALLSYS    CloseLibrary
  279.  
  280. .2        move.l    #128*256,d0
  281.         move.l    #MEMF_CLEAR+MEMF_FAST+MEMF_PUBLIC,d1
  282.         CALLSYS    AllocVec
  283.         move.l    d0,LookupMem
  284.         beq    .err0            ; no memory for vol_lookup
  285.         move.l    d0,vol_lookup
  286.         movea.l    d0,a0
  287.  
  288.         moveq    #0,d2
  289.         moveq    #0,d1
  290. .3        move.b    d1,d3
  291.         ext.w    d3
  292.         muls.w    d2,d3
  293.         divs.w    #127,d3            ; i*j/127
  294.         move.b    d3,(a0)+
  295.         addq.b    #1,d1
  296.         bne.b    .3
  297.         addq.b    #1,d2
  298.         cmpi.b    #128,d2
  299.         bne.b    .3
  300.  
  301.         CALLSYS    CreateMsgPort
  302.         move.l    d0,AudioPort
  303.         beq    .err1            ; couldn't create port
  304.         movea.l    d0,a0
  305.         move.l    #ioa_SIZEOF,d0
  306.         CALLSYS    CreateIORequest
  307.         move.l    d0,AudioIO
  308.         beq    .err2            ; couldn't create io
  309.  
  310.         movea.l    d0,a1
  311.         moveq    #0,d0
  312.         moveq    #0,d1
  313.         lea    AudioName,a0
  314.         CALLSYS    OpenDevice
  315.         tst.l    d0
  316.         bne    .err3            ; couldn't open audio.device
  317.  
  318.         movea.l    AudioIO,a1
  319.         move.w    #ADCMD_ALLOCATE,IO_COMMAND(a1)
  320.         move.b    #ADIOF_NOWAIT+IOF_QUICK,IO_FLAGS(a1)
  321.         move.l    #AudioAlloc,ioa_Data(a1)
  322.         move.l    #1,ioa_Length(a1)
  323.         movea.l    IO_DEVICE(a1),a6
  324.         jsr    DEV_BEGINIO(a6)
  325.         movea.l    _ExecBase,a6
  326.         tst.l    d0
  327.         bne    .err4            ; couldn't allocate channels
  328.  
  329.         movea.l    AudioIO,a1
  330.         move.w    #ADCMD_LOCK,IO_COMMAND(a1)
  331.         CALLSYS    SendIO
  332.  
  333.         lea    _custom,a0
  334.         move.w    #$0780,intena(a0)    ; kill int enable
  335.         move.w    #$0780,intreq(a0)    ; kill request
  336.         move.w    #$00FF,adkcon(a0)    ; kill modulation
  337.         move.w    #$000F,dmacon(a0)    ; disable dma
  338.  
  339.         move.l    #ClearBuf,aud0(a0)
  340.         move.w    #40,aud0+ac_len(a0)
  341.         move.w    period,aud0+ac_per(a0)
  342.         move.w    #0,aud0+ac_vol(a0)
  343.  
  344.         move.l    #ClearBuf,aud1(a0)
  345.         move.w    #40,aud1+ac_len(a0)
  346.         move.w    period,aud1+ac_per(a0)
  347.         move.w    #0,aud1+ac_vol(a0)
  348.  
  349.         move.l    #ClearBuf,aud2(a0)
  350.         move.w    #40,aud2+ac_len(a0)
  351.         move.w    period,aud2+ac_per(a0)
  352.         move.w    #0,aud2+ac_vol(a0)
  353.  
  354.         move.l    #ClearBuf,aud3(a0)
  355.         move.w    #40,aud3+ac_len(a0)
  356.         move.w    period,aud3+ac_per(a0)
  357.         move.w    #0,aud3+ac_vol(a0)
  358.  
  359.         moveq    #INTB_AUD0,d0
  360.         lea    AInt0,a1
  361.         CALLSYS    SetIntVector
  362.         move.l    d0,OldAInt0
  363.  
  364.         move.l    #QuietInst,Channel0
  365.         move.l    #QuietInst,Channel1
  366.         move.l    #QuietInst,Channel2
  367.         move.l    #QuietInst,Channel3
  368.         move.l    #QuietInst,Channel4
  369.         move.l    #QuietInst,Channel5
  370.         move.l    #QuietInst,Channel6
  371.         move.l    #QuietInst,Channel7
  372.         move.l    #QuietInst,Channel8
  373.         move.l    #QuietInst,Channel9
  374.         move.l    #QuietInst,Channel10
  375.         move.l    #QuietInst,Channel11
  376.         move.l    #QuietInst,Channel12
  377.         move.l    #QuietInst,Channel13
  378.         move.l    #QuietInst,Channel14
  379.         move.l    #QuietInst,Channel15
  380.  
  381.         clr.b    mus_playing
  382.         clr.b    mus_looping
  383.  
  384.         clr.l    MusDelay        ; MusDelay = 0
  385.         clr.l    VoiceAvail        ; all voices available
  386.  
  387.         CALLSYS    Disable
  388.         lea    _custom,a0
  389.         move.w    #$8080,intena(a0)    ; int enable
  390.         move.w    #$800F,dmacon(a0)    ; enable dma
  391.         bsr    AudioINT0        ; start audio
  392.         CALLSYS    Enable
  393.  
  394.         movem.l    (a7)+,d1-d7/a0-a6
  395.         moveq    #0,d0        ; okay
  396.         rts
  397.  
  398. .err4        movea.l    AudioIO,a1
  399.         CALLSYS    CloseDevice
  400.  
  401. .err3        movea.l    AudioIO,a0
  402.         CALLSYS    DeleteIORequest
  403.  
  404. .err2        movea.l    AudioPort,a0
  405.         CALLSYS    DeleteMsgPort
  406.  
  407. .err1        movea.l    LookupMem,a1
  408.         CALLSYS    FreeVec
  409.  
  410. .err0        movea.l    _DOSBase,a1
  411.         CALLSYS    CloseLibrary
  412.  
  413. .err        movem.l    (a7)+,d1-d7/a0-a6
  414.         moveq    #-1,d0        ; error
  415.         rts
  416.  
  417. ;--------------------------------------
  418.  
  419.         CNOP    0,16
  420.  
  421. ExitServer    movem.l    d1-d7/a0-a6,-(a7)
  422.  
  423.         lea    _custom,a0
  424.         move.w    #$0780,intena(a0)    ; kill int enable
  425.         move.w    #$0780,intreq(a0)    ; kill request
  426.         move.w    #$000F,dmacon(a0)    ; dma off
  427.  
  428.         moveq    #INTB_AUD0,d0
  429.         movea.l    OldAInt0,a1
  430.         movea.l    _ExecBase,a6
  431.         CALLSYS    SetIntVector
  432.  
  433.         movea.l    AudioIO,a1
  434.         move.w    #ADCMD_FREE,IO_COMMAND(a1)
  435.         move.b    #IOF_QUICK,IO_FLAGS(a1)
  436.         movea.l    IO_DEVICE(a1),a6
  437.         jsr    DEV_BEGINIO(a6)
  438.  
  439.         movea.l    _ExecBase,a6
  440.  
  441.         movea.l    AudioIO,a1
  442.         CALLSYS    CloseDevice
  443.  
  444.         movea.l    AudioIO,a0
  445.         CALLSYS    DeleteIORequest
  446.  
  447.         movea.l    AudioPort,a0
  448.         CALLSYS    DeleteMsgPort
  449.  
  450.         movea.l    LookupMem,a1
  451.         CALLSYS    FreeVec
  452.  
  453.         movea.l    _DOSBase,a1
  454.         CALLSYS    CloseLibrary
  455.  
  456.         movem.l    (a7)+,d1-d7/a0-a6
  457.         moveq    #0,d0
  458.         rts
  459.  
  460. ;--------------------------------------
  461.  
  462.         CNOP    0,16
  463.  
  464. Sfx_SetVol    move.w    d0,sfx_volume
  465.         rts
  466.  
  467. ;--------------------------------------
  468.  
  469.         CNOP    0,16
  470.  
  471. Sfx_Start    movem.l    d0-d4/a0-a2,-(a7)
  472.         lea    sfxVoiceTbl,a1
  473.         movea.l    (a1,d0.w*4),a1
  474.         lea    8(a0),a0
  475.         subq.l    #8,d4
  476.         move.l    a0,vc_Wave(a1)
  477.         clr.l    vc_Index(a1)
  478.         swap    d1
  479.         clr.w    d1
  480.         divu.l    #11025,d1
  481.         move.l    d1,vc_Step(a1)
  482.         clr.l    vc_Loop(a1)
  483.         lsl.l    #8,d4
  484.         move.l    d4,vc_Length(a1)
  485.  
  486.         addq.w    #1,d3        ; sep += 1
  487.         move.w    d2,d4
  488.         muls.w    d3,d4
  489.         muls.w    d3,d4
  490.         clr.w    d4
  491.         swap    d4
  492.         neg.w    d4
  493.         add.w    d2,d4        ; ltvol = vol - vol * (sep+1)^2 / 256^2
  494.         lsl.l    #8,d4
  495.         move.l    d4,vc_LtVol(a1)
  496.  
  497.         subi.l    #257,d3        ; sep -= 257
  498.         move.w    d2,d4
  499.         muls.w    d3,d4
  500.         muls.w    d3,d4
  501.         clr.w    d4
  502.         swap    d4
  503.         neg.w    d4
  504.         add.w    d2,d4        ; rtvol = vol - vol * (sep-257)^2 / 256^2
  505.         lsl.l    #8,d4
  506.         move.l    d4,vc_RtVol(a1)
  507.  
  508.         move.b    #$81,vc_Flags(a1)
  509.         movem.l    (a7)+,d0-d4/a0-a2
  510.         rts
  511.  
  512. ;--------------------------------------
  513.  
  514.         CNOP    0,16
  515.  
  516. Sfx_Update    movem.l    d0-d4/a0-a2,-(a7)
  517.         lea    sfxVoiceTbl,a1
  518.         movea.l    (a1,d0.w*4),a1
  519.         swap    d1
  520.         clr.w    d1
  521.         divu.l    #11025,d1
  522.         move.l    d1,vc_Step(a1)
  523.  
  524.         addq.w    #1,d3        ; sep += 1
  525.         move.w    d2,d4
  526.         muls.w    d3,d4
  527.         muls.w    d3,d4
  528.         clr.w    d4
  529.         swap    d4
  530.         neg.w    d4
  531.         add.w    d2,d4        ; ltvol = vol - vol * (sep+1)^2 / 256^2
  532.         lsl.l    #8,d4
  533.         move.l    d4,vc_LtVol(a1)
  534.  
  535.         subi.l    #257,d3        ; sep -= 257
  536.         move.w    d2,d4
  537.         muls.w    d3,d4
  538.         muls.w    d3,d4
  539.         clr.w    d4
  540.         swap    d4
  541.         neg.w    d4
  542.         add.w    d2,d4        ; rtvol = vol - vol * (sep-257)^2 / 256^2
  543.         lsl.l    #8,d4
  544.         move.l    d4,vc_RtVol(a1)
  545.  
  546.         movem.l    (a7)+,d0-d4/a0-a2
  547.         rts
  548.  
  549. ;--------------------------------------
  550.  
  551.         CNOP    0,16
  552.  
  553. Sfx_Stop    move.l    a0,-(a7)
  554.         lea    sfxVoiceTbl,a0
  555.         movea.l    (a0,d0.w*4),a0
  556.         bclr    #0,vc_Flags(a0)
  557.         movea.l    (a7)+,a0
  558.         rts
  559.  
  560. ;--------------------------------------
  561.  
  562.         CNOP    0,16
  563.  
  564. Sfx_Done    move.l    a0,-(a7)
  565.         lea    sfxVoiceTbl,a0
  566.         movea.l    (a0,d0.w*4),a0
  567.         moveq    #0,d0
  568.         btst    #0,vc_Flags(a0)
  569.         beq.b    .1        ; not playing
  570.         move.l    vc_Index(a0),d0
  571.         addq.l    #1,d0        ; for safety
  572. .1        movea.l    (a7)+,a0
  573.         rts
  574.  
  575. ;--------------------------------------
  576.  
  577.         CNOP    0,16
  578.  
  579. Mus_SetVol    move.w    d0,mus_volume
  580.         rts
  581.  
  582. ;--------------------------------------
  583.  
  584.         CNOP    0,16
  585.  
  586. Mus_Register    movem.l    d1-d7/a0-a6,-(sp)
  587.         bsr    Mus_Unregister
  588.  
  589.         move.l    a0,MUSMemPtr
  590.  
  591.         cmpi.l    #$4D55531A,(a0)        ; "MUS",26
  592.         bne    .err0            ; not a mus file
  593.  
  594.         move.l    MUSMemPtr,MusPtr
  595.  
  596.         bsr    TestMUSFile
  597.         beq    .err0
  598.  
  599.         move.l    InstrFile,d1
  600.         move.l    #MODE_OLDFILE,d2
  601.         CALLDOS    Open
  602.         move.l    d0,InstrHandle
  603.         beq    .err0
  604.  
  605.         move.l    #MEMF_CLEAR,d0        ; any memory
  606.         move.l    #65536,d1        ; puddle size
  607.         move.l    #32768,d2        ; threshold size
  608.         bsr    CreatePool
  609.         move.l    a0,InstrPool
  610.         beq    .err1
  611.  
  612.         movea.l    a0,a2
  613.         movea.l    MusPtr,a3
  614.  
  615.         move.w    #255,d0
  616.         lea    Instruments,a0
  617. .setinstr    move.l    #QuietInst,(a0)+
  618.         dbra    d0,.setinstr
  619.  
  620.         move.w    $C(a3),d4        ; instrCnt
  621.         ror.w    #8,d4
  622.         subq.w    #1,d4            ; for dbra
  623.  
  624.         lea    $10(a3),a3        ; instruments[]
  625.  
  626. .instrloop    moveq    #14,d0
  627.         movea.l    a2,a0
  628.         bsr    AllocPooled
  629.  
  630.         moveq    #0,d2
  631.         move.b    (a3)+,d2        ; instrument #
  632.         moveq    #0,d1
  633.         move.b    (a3)+,d1        ; offset to next instr. #
  634.         adda.l    d1,a3            ; skip it (whatever it is?)
  635.  
  636.         lea    Instruments,a0
  637.         move.l    d0,(a0,d2.w*4)
  638.         beq    .err2
  639.  
  640.         movea.l    d0,a4            ; instrument record
  641.  
  642.         bftst    (validInstr){d2:1}
  643.         beq    .next            ; no instrument
  644.  
  645.         move.l    InstrHandle,d1
  646.         lsl.l    #2,d2
  647.         moveq    #OFFSET_BEGINNING,d3
  648.         CALLDOS    Seek
  649.  
  650.         move.l    InstrHandle,d1
  651.         move.l    a4,d2
  652.         moveq    #4,d3
  653.         CALLSYS    Read            ; get instrument offset
  654.         addq.l    #1,d0
  655.         beq    .err2            ; can't read file
  656.  
  657.         move.l    InstrHandle,d1
  658.         move.l    (a4),d2
  659.         moveq    #OFFSET_BEGINNING,d3
  660.         CALLSYS    Seek
  661.  
  662.         move.l    InstrHandle,d1
  663.         move.l    a4,d2
  664.         moveq    #14,d3
  665.         CALLSYS    Read            ; get instrument header
  666.         addq.l    #1,d0
  667.         beq    .err2            ; can't read file
  668.  
  669.         move.l    in_Length(a4),d0
  670.         swap    d0
  671.         movea.l    a2,a0
  672.         bsr    AllocPooled
  673.         move.l    d0,in_Wave(a4)        ; wave data buffer
  674.         beq    .err2
  675.  
  676.         move.l    InstrHandle,d1
  677.         move.l    d0,d2
  678.         move.l    in_Length(a4),d3
  679.         swap    d3
  680.         CALLDOS    Read            ; get instrument samples
  681.         addq.l    #1,d0
  682.         beq    .err2            ; can't read file
  683.  
  684.         move.b    #1,in_Flags(a4)
  685. .next        dbra    d4,.instrloop
  686.  
  687.         move.l    InstrHandle,d1
  688.         CALLDOS    Close
  689.         clr.l    InstrHandle
  690.  
  691.         moveq    #1,d0            ; return handle=1
  692.         movem.l    (sp)+,d1-d7/a0-a6
  693.         rts
  694.  
  695. .err2        movea.l    InstrPool,a0
  696.         bsr    DeletePool
  697.         clr.l    InstrPool
  698.  
  699. .err1        move.l    InstrHandle,d1
  700.         CALLDOS    Close
  701.         clr.l    InstrHandle
  702.  
  703. .err0        moveq    #0,d0            ; return handle=0
  704.         movem.l    (sp)+,d1-d7/a0-a6
  705.         rts
  706.  
  707. ;--------------------------------------
  708.  
  709.         CNOP    0,16
  710.  
  711. Mus_Unregister    movem.l    d0-d7/a0-a6,-(a7)
  712.         bsr    Mus_Stop
  713.  
  714.         clr.l    MUSMemPtr
  715.         clr.l    MUSMemSize
  716.  
  717.         tst.l    InstrPool
  718.         beq.b    .1
  719.         movea.l    InstrPool,a0
  720.         bsr    DeletePool
  721.         clr.l    InstrPool
  722.  
  723. .1        movem.l    (a7)+,d0-d7/a0-a6
  724.         rts
  725.  
  726. ;--------------------------------------
  727.  
  728.         CNOP    0,16
  729.  
  730. Mus_Play    move.b    d1,mus_looping
  731.         move.b    #2,mus_playing        ; 2 = play from start
  732.         rts
  733.  
  734. ;--------------------------------------
  735.  
  736.         CNOP    0,16
  737.  
  738. Mus_Stop    tst.b    mus_playing
  739.         beq.b    .2
  740.         st    mus_playing        ; -1 = stop playing
  741. .1        tst.b    mus_playing
  742.         bne.b    .1
  743.  
  744. .2        move.l    #QuietInst,Channel0
  745.         move.l    #QuietInst,Channel1
  746.         move.l    #QuietInst,Channel2
  747.         move.l    #QuietInst,Channel3
  748.         move.l    #QuietInst,Channel4
  749.         move.l    #QuietInst,Channel5
  750.         move.l    #QuietInst,Channel6
  751.         move.l    #QuietInst,Channel7
  752.         move.l    #QuietInst,Channel8
  753.         move.l    #QuietInst,Channel9
  754.         move.l    #QuietInst,Channel10
  755.         move.l    #QuietInst,Channel11
  756.         move.l    #QuietInst,Channel12
  757.         move.l    #QuietInst,Channel13
  758.         move.l    #QuietInst,Channel14
  759.         move.l    #QuietInst,Channel15
  760.  
  761.         clr.b    Voice0+vc_Flags        ; disable voices
  762.         clr.b    Voice1+vc_Flags
  763.         clr.b    Voice2+vc_Flags
  764.         clr.b    Voice3+vc_Flags
  765.         clr.b    Voice4+vc_Flags
  766.         clr.b    Voice5+vc_Flags
  767.         clr.b    Voice6+vc_Flags
  768.         clr.b    Voice7+vc_Flags
  769.         clr.b    Voice8+vc_Flags
  770.         clr.b    Voice9+vc_Flags
  771.         clr.b    Voice10+vc_Flags
  772.         clr.b    Voice11+vc_Flags
  773.         clr.b    Voice12+vc_Flags
  774.         clr.b    Voice13+vc_Flags
  775.         clr.b    Voice14+vc_Flags
  776.         clr.b    Voice15+vc_Flags
  777.  
  778.         clr.b    mus_looping
  779.         clr.l    MusDelay        ; MusDelay = 0
  780.         clr.l    VoiceAvail        ; all voices available
  781.         rts
  782.  
  783. ;--------------------------------------
  784.  
  785.         CNOP    0,16
  786.  
  787. Mus_Pause    clr.b    mus_playing        ; 0 = not playing
  788.         rts
  789.  
  790. ;--------------------------------------
  791.  
  792.         CNOP    0,16
  793.  
  794. Mus_Resume    move.b    #1,mus_playing        ; 1 = play
  795.         rts
  796.  
  797. ;--------------------------------------
  798.  
  799.         CNOP    0,16
  800.  
  801. Mus_Done    moveq    #0,d0
  802.         move.b    mus_playing,d0
  803.         rts
  804.  
  805. ;------------------------------------------------------------------------
  806.  
  807.         CNOP    0,16
  808.  
  809. TestMUSFile    movea.l    MusPtr,a0
  810.         move.l    MUSMemSize,d3        ; d3 = total file size
  811.         moveq    #0,d0
  812.         move.w    4(a0),d0
  813.         beq    .fail
  814.         ror.w    #8,d0            ; score length
  815.         moveq    #0,d1
  816.         move.w    6(a0),d1
  817.         ror.w    #8,d1            ; score start
  818.         cmpi.w    #18,d1            ; start < 18? (1 instr.)
  819.         blt    .fail
  820.         add.l    d1,d0            ; d0 = total size
  821.  
  822.         move.l    d0,d3
  823.         move.l    d3,MUSMemSize
  824.  
  825.         move.w    12(a0),d2
  826.         beq.b    .fail
  827.         ror.w    #8,d2            ; d2 = instr. count
  828.         subq.w    #1,d2
  829.         lea    16(a0),a1        ; a1 = * instr. list
  830. .loop        addq.l    #1,a1            ; skip instr. value
  831.         moveq    #0,d0
  832.         move.b    (a1)+,d0        ; d0 = offset to next instr.
  833.         adda.l    d0,a1            ; skip info (?)
  834.         dbra    d2,.loop        ; next
  835.         move.l    a1,d0            ; d0 = * data following list
  836.         sub.l    a0,d0            ; - file start
  837.         cmp.l    d0,d1            ; = start?
  838.         bne.b    .fail
  839.         move.b    -1(a0,d3.l),d0        ; get last byte
  840.         lsr.b    #4,d0
  841.         cmpi.b    #6,d0            ; last byte = $6x? (end)
  842.         bne.b    .fail
  843.         moveq    #1,d0            ; file okay
  844.         rts
  845.  
  846. .fail        moveq    #0,d0            ; yikes!
  847.         rts
  848.  
  849. ;------------------------------------------------------------------------
  850.  
  851.         cnop    0,16
  852.  
  853. AudioINT0    movem.l    d2-d7/a2-a6,-(a7)
  854.         move.l    chip_offset,d0
  855.         add.l    d0,chip_buffer        ; switch buffers
  856.         neg.l    d0
  857.         move.l    d0,chip_offset
  858.  
  859.         lea    _custom,a0
  860.         move.w    #$0780,intreq(a0)    ; clear int requests
  861.  
  862.         tst.b    mus_playing
  863.         bgt.b    .domus
  864.         beq.b    .musoff
  865.         addq.b    #1,mus_playing        ; now off
  866.  
  867. .musoff        move.l    #ClearBuf,aud3(a0)
  868.         move.w    #40,aud3+ac_len(a0)
  869.         move.w    period,aud3+ac_per(a0)
  870.         move.w    #0,aud3+ac_vol(a0)
  871.  
  872.         move.l    #ClearBuf,aud2(a0)
  873.         move.w    #40,aud2+ac_len(a0)
  874.         move.w    period,aud2+ac_per(a0)
  875.         move.w    #0,aud2+ac_vol(a0)
  876.  
  877.         bra    .dosfx
  878.  
  879. .domus        cmpi.b    #2,mus_playing
  880.         bne.b    .musnxt
  881.         subq.b    #1,mus_playing
  882.  
  883.         movea.l    MusPtr,a1
  884.         moveq    #0,d1
  885.         move.w    6(a1),d1        ; score start
  886.         ror.w    #8,d1
  887.         adda.l    d1,a1            ; a1 = start
  888.         move.l    a1,MusIndex        ; store index
  889.  
  890. .musnxt        subq.l    #1,MusDelay
  891.         bpl.b    .fillmus
  892.  
  893.         bsr    NextEvent
  894.  
  895. .fillmus    lea    Voice0,a0        ; music voices
  896.         movea.l    chip_buffer,a2
  897.         bsr    FillBuffer
  898.  
  899.         lea    _custom,a0
  900.  
  901.         move.l    chip_buffer,d0
  902.         move.l    d0,aud3(a0)        ; left mus
  903.         move.w    #40,aud3+ac_len(a0)    ; 80 samples
  904.         move.w    period,aud3+ac_per(a0)
  905.         move.w    mus_volume,aud3+ac_vol(a0)
  906.  
  907.         addi.l    #128,d0
  908.         move.l    d0,aud2(a0)        ; right mus
  909.         move.w    #40,aud2+ac_len(a0)    ; 80 samples
  910.         move.w    period,aud2+ac_per(a0)
  911.         move.w    mus_volume,aud2+ac_vol(a0)
  912.  
  913. .dosfx        lea    Voice16,a0        ; sound effect voices
  914.         movea.l    chip_buffer,a2
  915.         lea    256(a2),a2
  916.         bsr    FillBuffer
  917.  
  918.         lea    _custom,a0
  919.  
  920.         move.l    chip_buffer,d0
  921.         addi.l    #256,d0
  922.         move.l    d0,aud0(a0)        ; left sfx
  923.         move.w    #40,aud0+ac_len(a0)    ; 80 samples
  924.         move.w    period,aud0+ac_per(a0)
  925.         move.w    sfx_volume,aud0+ac_vol(a0)
  926.  
  927.         addi.l    #128,d0
  928.         move.l    d0,aud1(a0)        ; right sfx
  929.         move.w    #40,aud1+ac_len(a0)    ; 80 samples
  930.         move.w    period,aud1+ac_per(a0)
  931.         move.w    sfx_volume,aud1+ac_vol(a0)
  932.  
  933. .exit        movem.l    (a7)+,d2-d7/a2-a6
  934.         moveq    #0,d0
  935.         rts
  936.  
  937. ;------------------------------------------------------------------------
  938.  
  939.         CNOP    0,16
  940.  
  941. FillBuffer    movea.l    a2,a4
  942.         lea    tempAudio,a1
  943.         moveq    #4,d0
  944. .lcloop        clr.l    (a1)+
  945.         clr.l    (a1)+
  946.         clr.l    (a1)+
  947.         clr.l    (a1)+
  948.         dbra    d0,.lcloop
  949.  
  950.         lea    tempAudio+128,a1
  951.         moveq    #4,d0
  952. .rcloop        clr.l    (a1)+
  953.         clr.l    (a1)+
  954.         clr.l    (a1)+
  955.         clr.l    (a1)+
  956.         dbra    d0,.rcloop
  957.         bra.b    .1stvoice
  958.  
  959. .next        move.l    vc_Next(a0),d0        ; next voice
  960.         bne.b    .chkvoice
  961.  
  962.         lea    128(a4),a2
  963.         lea    tempAudio,a1
  964.         moveq    #4,d0
  965. .lmloop        move.l    (a1)+,(a4)+
  966.         move.l    (a1)+,(a4)+
  967.         move.l    (a1)+,(a4)+
  968.         move.l    (a1)+,(a4)+
  969.         dbra    d0,.lmloop
  970.  
  971.         lea    tempAudio+128,a1
  972.         moveq    #4,d0
  973. .rmloop        move.l    (a1)+,(a2)+
  974.         move.l    (a1)+,(a2)+
  975.         move.l    (a1)+,(a2)+
  976.         move.l    (a1)+,(a2)+
  977.         dbra    d0,.rmloop
  978.         rts
  979.  
  980. .chkvoice    movea.l    d0,a0
  981. .1stvoice    btst    #0,vc_Flags(a0)
  982.         beq.b    .next            ; not enabled
  983.  
  984. ;------------------
  985. ; do voice
  986.         btst    #7,vc_Flags(a0)
  987.         bne    .5            ; sfx
  988.  
  989.         btst    #1,vc_Flags(a0)
  990.         beq.b    .1            ; not releasing
  991.  
  992.         tst.l    vc_LtVol(a0)
  993.         beq.b    .0
  994.         subi.l    #256,vc_LtVol(a0)
  995.  
  996. .0        tst.l    vc_RtVol(a0)
  997.         beq.b    .1
  998.         subi.l    #256,vc_RtVol(a0)
  999.  
  1000. .1        move.l    vc_LtVol(a0),d6
  1001.         move.l    vc_RtVol(a0),d7
  1002.         tst.l    d6
  1003.         bne.b    .2            ; not off yet
  1004.         tst.l    d7
  1005.         bne.b    .2            ; not off yet
  1006.  
  1007.         clr.b    vc_Flags(a0)        ; voice off
  1008.         bra    .next
  1009.  
  1010. .2        lea    tempAudio,a1        ; left buffer
  1011.         movea.l    vol_lookup,a5
  1012.  
  1013.         movem.l    vc_Index(a0),d1-d4    ; index,step,loop,length
  1014.  
  1015.         movea.l    vc_Channel(a0),a3
  1016.         move.l    ch_Pitch(a3),d0
  1017.         muls.l    d0,d5:d2
  1018.         move.w    d5,d2
  1019.         swap    d2
  1020.         add.l    vc_Step(a0),d2        ; final sample rate
  1021.  
  1022.         movea.l    vc_Wave(a0),a3        ; sample data
  1023.  
  1024.         moveq    #79,d5            ; 80 samples
  1025. .floop        move.l    d1,d0
  1026.         swap    d0
  1027.         move.b    (a3,d0.w),d6        ; sample
  1028.         move.b    d6,d7
  1029.         move.b    (a5,d6.l),d6        ; convert
  1030.         move.b    (a5,d7.l),d7        ; convert
  1031.         asr.b    #2,d6
  1032.         asr.b    #2,d7
  1033.         add.b    d6,(a1)+        ; left sample
  1034.         add.b    d7,127(a1)        ; right sample
  1035.  
  1036.         add.l    d2,d1
  1037.         cmp.l    d4,d1
  1038.         blo.b    .3
  1039.         sub.l    d4,d1
  1040.         add.l    d3,d1
  1041.         tst.l    d3
  1042.         beq.b    .4            ; no looping
  1043. .3        dbra    d5,.floop
  1044.         bra.b    .done            ; done with voice
  1045.  
  1046. ; ran out of data
  1047. .4        clr.b    vc_Flags(a0)        ; voice off
  1048.  
  1049. .done        move.l    d1,vc_Index(a0)
  1050.         bra    .next
  1051.  
  1052. ; do sfx voice
  1053.  
  1054. .5        move.l    vc_LtVol(a0),d6
  1055.         move.l    vc_RtVol(a0),d7
  1056.  
  1057.         lea    tempAudio,a1        ; left buffer
  1058.         movea.l    vol_lookup,a5
  1059.  
  1060.         movem.l    vc_Index(a0),d1-d4    ; index,step,loop,length
  1061.  
  1062.         move.l    vc_Step(a0),d2        ; sample rate
  1063.         lsr.l    #8,d2
  1064.  
  1065.         movea.l    vc_Wave(a0),a3        ; sample data
  1066.  
  1067.         moveq    #79,d5            ; 80 samples
  1068. .sfloop        move.l    d1,d0
  1069.         lsr.l    #8,d0
  1070.         move.b    (a3,d0.l),d6        ; sample
  1071.         move.b    d6,d7
  1072.         move.b    (a5,d6.l),d6        ; convert
  1073.         move.b    (a5,d7.l),d7        ; convert
  1074.         asr.b    #2,d6
  1075.         asr.b    #2,d7
  1076.         add.b    d6,(a1)+        ; left sample
  1077.         add.b    d7,127(a1)        ; right sample
  1078.  
  1079.         add.l    d2,d1
  1080.         cmp.l    d4,d1
  1081.         bhs.b    .4            ; ran out of data
  1082.         dbra    d5,.sfloop
  1083.         bra    .done            ; done with voice
  1084.  
  1085. ;------------------------------------------------------------------------
  1086.  
  1087.         CNOP    0,16
  1088.  
  1089. NextEvent    movea.l    MusIndex,a1
  1090.  
  1091. .0        move.b    (a1)+,d0        ; get next event
  1092.         move.b    d0,d1
  1093.         lsr.b    #3,d1
  1094.         andi.w    #$E,d1            ; d1 = event type * 2
  1095.         lea    EventTable,a0
  1096.         move.w    (a0,d1.w),d1
  1097.         jsr    (a0,d1.w)        ; do event
  1098.         tst.b    d0
  1099.         bpl.b    .0            ; more events
  1100.  
  1101.         moveq    #0,d1            ; time = 0
  1102. .1        move.b    (a1)+,d0        ; get byte
  1103.         bpl.b    .2
  1104.  
  1105.         andi.w    #$7F,d0            ; kill sign bit
  1106.         or.b    d0,d1            ; time = time + 7 bits
  1107.         lsl.l    #7,d1            ; * 128
  1108.         bra.b    .1            ; get next 7 bits
  1109.  
  1110. .2        or.b    d0,d1            ; time = time + last 7 bits
  1111.         subq.l    #1,d1            ; delay = time - 1
  1112.         bmi.b    .0            ; (no delay)
  1113.  
  1114.         move.l    d1,MusDelay        ; store delay
  1115.         move.l    a1,MusIndex        ; store index
  1116.         rts
  1117.  
  1118. ;------------------------------------------------------------------------
  1119.  
  1120. Release        moveq    #15,d1
  1121.         and.b    d0,d1            ; d1 = channel
  1122.  
  1123.         lea    Channels,a0
  1124.         movea.l    (a0,d1.w*4),a0        ; channel record
  1125.         movea.l    ch_Map(a0),a0        ; channel map
  1126.  
  1127.         move.b    (a1)+,d1        ; note #
  1128.         moveq    #0,d2
  1129.         move.b    (a0,d1.w),d2        ; voice #
  1130.         beq.b    .exit            ; no mapping
  1131.  
  1132.         clr.b    (a0,d1.w)        ; clear mapping
  1133.         move.l    VoiceAvail,d3
  1134.         bclr    d2,d3            ; voice free for use
  1135.         move.l    d3,VoiceAvail
  1136.  
  1137.         lea    Voices,a0
  1138.         movea.l    (a0,d2.w*4),a0        ; voice
  1139.         bset    #1,vc_Flags(a0)        ; do release
  1140.  
  1141. .exit        rts
  1142.  
  1143. ;------------------------------------------------------------------------
  1144.  
  1145. PlayNote    moveq    #15,d1
  1146.         and.b    d0,d1            ; d1 = channel
  1147.  
  1148.         lea    Channels,a0
  1149.         movea.l    (a0,d1.w*4),a2        ; channel record
  1150.         movea.l    ch_Map(a2),a0        ; channel map
  1151.  
  1152.         moveq    #-1,d2            ; no volume change
  1153.         move.b    (a1)+,d1        ; note #
  1154.         bclr    #7,d1
  1155.         beq.b    .getvc            ; no volume
  1156.  
  1157.         moveq    #0,d2
  1158.         move.b    (a1)+,d2        ; volume
  1159.  
  1160. .getvc        moveq    #0,d3
  1161.         move.l    VoiceAvail,d4
  1162. .vloop        bset    d3,d4
  1163.         beq.b    .foundfree
  1164.         addq.b    #1,d3
  1165.         cmpi.b    #16,d3
  1166.         bne.b    .vloop
  1167. ; no free voices
  1168.         rts
  1169.  
  1170.  
  1171. .foundfree    move.b    d3,(a0,d1.w)        ; voice mapping
  1172.         move.l    d4,VoiceAvail
  1173.  
  1174.         lea    Voices,a0
  1175.         movea.l    (a0,d3.w*4),a3        ; voice
  1176.  
  1177.         tst.b    d2
  1178.         bmi.b    .skip
  1179.  
  1180. ; new channel volume
  1181.  
  1182.         move.b    d2,ch_Vol(a2)
  1183.         moveq    #0,d3
  1184.         move.b    ch_Pan(a2),d3
  1185.         addq.w    #1,d3        ; sep += 1
  1186.         move.w    d2,d4
  1187.         muls.w    d3,d4
  1188.         muls.w    d3,d4
  1189.         clr.w    d4
  1190.         swap    d4
  1191.         neg.w    d4
  1192.         add.w    d2,d4        ; ltvol = vol - vol * (sep+1)^2 / 256^2
  1193.         lsl.l    #8,d4
  1194.         move.l    d4,ch_LtVol(a2)
  1195.  
  1196.         subi.l    #257,d3        ; sep -= 257
  1197.         move.w    d2,d4
  1198.         muls.w    d3,d4
  1199.         muls.w    d3,d4
  1200.         clr.w    d4
  1201.         swap    d4
  1202.         neg.w    d4
  1203.         add.w    d2,d4        ; rtvol = vol - vol * (sep-257)^2 / 256^2
  1204.         lsl.l    #8,d4
  1205.         move.l    d4,ch_RtVol(a2)
  1206.  
  1207. .skip        move.l    ch_LtVol(a2),vc_LtVol(a3)
  1208.         move.l    ch_RtVol(a2),vc_RtVol(a3)
  1209.  
  1210.         moveq    #15,d2
  1211.         and.b    d0,d2
  1212.         cmpi.b    #15,d2
  1213.         beq.b    .percussion
  1214.  
  1215.         move.l    ch_Instr(a2),a4        ; instrument record
  1216.  
  1217.         lea    NoteTable,a0
  1218.         moveq    #72,d2            ; one octave above middle c
  1219.         sub.b    in_Base(a4),d2
  1220.         add.b    d1,d2
  1221.         move.l    (a0,d2.w*4),vc_Step(a3)    ; step value for note
  1222.  
  1223.         clr.l    vc_Index(a3)
  1224.  
  1225.         move.l    a2,vc_Channel(a3)    ; back link (for pitch wheel)
  1226.  
  1227.         move.l    in_Wave(a4),vc_Wave(a3)
  1228.         move.l    in_Loop(a4),vc_Loop(a3)
  1229.         move.l    in_Length(a4),vc_Length(a3)
  1230.         move.b    in_Flags(a4),vc_Flags(a3)
  1231. .exit        rts
  1232.  
  1233. ; for the percussion channel, the note played sets the percussion instrument
  1234.  
  1235. .percussion    move.l    #65536,vc_Step(a3)    ; sample rate always 1.0
  1236.  
  1237.         clr.l    vc_Index(a3)
  1238.  
  1239.         move.l    a2,vc_Channel(a3)    ; back link
  1240.  
  1241.         addi.b    #100,d1            ; percussion instruments
  1242.  
  1243.         lea    Instruments,a0
  1244.         move.l    (a0,d1.w*4),a0        ; instrument record
  1245.         move.l    in_Wave(a0),vc_Wave(a3)
  1246.         move.l    in_Loop(a0),vc_Loop(a3)
  1247.         move.l    in_Length(a0),vc_Length(a3)
  1248.         move.b    in_Flags(a0),vc_Flags(a3)
  1249.         rts
  1250.  
  1251. ;------------------------------------------------------------------------
  1252.  
  1253. Pitch        moveq    #15,d1
  1254.         and.b    d0,d1            ; d1 = channel
  1255.  
  1256.         lea    Channels,a0
  1257.         movea.l    (a0,d1.w*4),a2        ; channel record
  1258.  
  1259.         moveq    #0,d1
  1260.         move.b    (a1)+,d1        ; pitch wheel setting
  1261.         lea    PitchTable,a0
  1262.         move.l    (a0,d1.w*4),ch_Pitch(a2)
  1263.         rts
  1264.  
  1265. ;------------------------------------------------------------------------
  1266.  
  1267. Tempo        addq.l    #1,a1            ; skip value
  1268.         rts
  1269.  
  1270. ;------------------------------------------------------------------------
  1271.  
  1272. ChangeCtrl    moveq    #15,d1
  1273.         and.b    d0,d1            ; d1 = channel
  1274.  
  1275.         lea    Channels,a0
  1276.         movea.l    (a0,d1.w*4),a2        ; channel
  1277.  
  1278.         move.b    (a1)+,d1        ; get controller
  1279.  
  1280.         moveq    #0,d2
  1281.         move.b    (a1)+,d2        ; value
  1282.  
  1283.         tst.b    d1
  1284.         bne.b    .1
  1285.  
  1286. ; set channel instrument
  1287.  
  1288.         lea    Instruments,a0
  1289.         move.l    (a0,d2.w*4),ch_Instr(a2)
  1290.         bne.b    .0
  1291.         move.l    #QuietInst,ch_Instr(a2)
  1292. .0        rts
  1293.  
  1294. .1        cmpi.b    #3,d1            ; volume?
  1295.         bne.b    .2
  1296.  
  1297. ; set channel volume
  1298.  
  1299.         move.b    d2,ch_Vol(a2)
  1300.         moveq    #0,d3
  1301.         move.b    ch_Pan(a2),d3
  1302.         addq.w    #1,d3        ; sep += 1
  1303.         move.w    d2,d4
  1304.         muls.w    d3,d4
  1305.         muls.w    d3,d4
  1306.         clr.w    d4
  1307.         swap    d4
  1308.         neg.w    d4
  1309.         add.w    d2,d4        ; ltvol = vol - vol * (sep+1)^2 / 256^2
  1310.         lsl.l    #8,d4
  1311.         move.l    d4,ch_LtVol(a2)
  1312.  
  1313.         subi.w    #257,d3        ; sep -= 257
  1314.         move.w    d2,d4
  1315.         muls.w    d3,d4
  1316.         muls.w    d3,d4
  1317.         clr.w    d4
  1318.         swap    d4
  1319.         neg.w    d4
  1320.         add.w    d2,d4        ; rtvol = vol - vol * (sep-257)^2 / 256^2
  1321.         lsl.l    #8,d4
  1322.         move.l    d4,ch_RtVol(a2)
  1323.         rts
  1324.  
  1325. .2        cmpi.b    #4,d1            ; pan?
  1326.         bne.b    .exit
  1327.  
  1328. ; set channel pan
  1329.  
  1330.         add.b    d2,d2        ; pan -> sep
  1331.         move.b    d2,ch_Pan(a2)
  1332.         move.b    ch_Vol(a2),d2
  1333.         moveq    #0,d3
  1334.         move.b    ch_Pan(a2),d3
  1335.         addq.w    #1,d3        ; sep += 1
  1336.         move.w    d2,d4
  1337.         muls.w    d3,d4
  1338.         muls.w    d3,d4
  1339.         clr.w    d4
  1340.         swap    d4
  1341.         neg.w    d4
  1342.         add.w    d2,d4        ; ltvol = vol - vol * (sep+1)^2 / 256^2
  1343.         lsl.l    #8,d4
  1344.         move.l    d4,ch_LtVol(a2)
  1345.  
  1346.         subi.w    #257,d3        ; sep -= 257
  1347.         move.w    d2,d4
  1348.         muls.w    d3,d4
  1349.         muls.w    d3,d4
  1350.         clr.w    d4
  1351.         swap    d4
  1352.         neg.w    d4
  1353.         add.w    d2,d4        ; rtvol = vol - vol * (sep-257)^2 / 256^2
  1354.         lsl.l    #8,d4
  1355.         move.l    d4,ch_RtVol(a2)
  1356. .exit        rts
  1357.  
  1358. ;------------------------------------------------------------------------
  1359.  
  1360. NoEvent        rts
  1361.  
  1362. ;------------------------------------------------------------------------
  1363.  
  1364. EndScore    tst.b    mus_looping        ; loop?
  1365.         bne    .loop
  1366.  
  1367.         move.l    #QuietInst,Channel0
  1368.         move.l    #QuietInst,Channel1
  1369.         move.l    #QuietInst,Channel2
  1370.         move.l    #QuietInst,Channel3
  1371.         move.l    #QuietInst,Channel4
  1372.         move.l    #QuietInst,Channel5
  1373.         move.l    #QuietInst,Channel6
  1374.         move.l    #QuietInst,Channel7
  1375.         move.l    #QuietInst,Channel8
  1376.         move.l    #QuietInst,Channel9
  1377.         move.l    #QuietInst,Channel10
  1378.         move.l    #QuietInst,Channel11
  1379.         move.l    #QuietInst,Channel12
  1380.         move.l    #QuietInst,Channel13
  1381.         move.l    #QuietInst,Channel14
  1382.         move.l    #QuietInst,Channel15
  1383.  
  1384.         clr.b    Voice0+vc_Flags        ; disable voices
  1385.         clr.b    Voice1+vc_Flags
  1386.         clr.b    Voice2+vc_Flags
  1387.         clr.b    Voice3+vc_Flags
  1388.         clr.b    Voice4+vc_Flags
  1389.         clr.b    Voice5+vc_Flags
  1390.         clr.b    Voice6+vc_Flags
  1391.         clr.b    Voice7+vc_Flags
  1392.         clr.b    Voice8+vc_Flags
  1393.         clr.b    Voice9+vc_Flags
  1394.         clr.b    Voice10+vc_Flags
  1395.         clr.b    Voice11+vc_Flags
  1396.         clr.b    Voice12+vc_Flags
  1397.         clr.b    Voice13+vc_Flags
  1398.         clr.b    Voice14+vc_Flags
  1399.         clr.b    Voice15+vc_Flags
  1400.  
  1401.         clr.l    MusDelay        ; MusDelay = 0
  1402.         clr.l    VoiceAvail        ; all voices available
  1403.         clr.b    mus_playing
  1404.         addq.l    #4,a7            ; pop NextEvent
  1405.         rts
  1406.  
  1407. .loop        movea.l    MusPtr,a1
  1408.         moveq    #0,d1
  1409.         move.w    6(a1),d1        ; score start
  1410.         ror.w    #8,d1
  1411.         adda.l    d1,a1            ; a1 = start
  1412.         rts
  1413.  
  1414. ;------------------------------------------------------------------------
  1415.         cnop    0,4
  1416.  
  1417. EventTable    dc.w    Release-EventTable
  1418.         dc.w    PlayNote-EventTable
  1419.         dc.w    Pitch-EventTable
  1420.         dc.w    Tempo-EventTable
  1421.         dc.w    ChangeCtrl-EventTable
  1422.         dc.w    NoEvent-EventTable
  1423.         dc.w    EndScore-EventTable
  1424.         dc.w    NoEvent-EventTable
  1425.  
  1426. ;------------------------------------------------------------------------
  1427. ;--------------------------------------------------------------------
  1428.  
  1429.         cnop    0,4
  1430.  
  1431. CreatePool    movea.l    _ExecBase,a1
  1432.         cmpi.w    #39,LIB_VERSION(a1)
  1433.         blt.b    .nopools        ; change to bra for debugging
  1434.  
  1435.         move.l    a6,-(sp)
  1436.         movea.l    a1,a6
  1437.         CALLSYS    CreatePool
  1438.         movea.l    (sp)+,a6
  1439.         rts
  1440.  
  1441. .nopools    movem.l    d2-d7/a2-a6,-(sp)
  1442.         move.l    d0,d4            ; memory attributes
  1443.         move.l    d1,d3            ; amount to allocate when low
  1444.         move.l    d2,d5            ; size of when not to use pool
  1445.  
  1446.         exg.l    d0,d1            ; swap flags and size
  1447.         movea.l    a1,a6
  1448.         CALLSYS    AllocMem        ; get first block
  1449.         movea.l    d0,a0
  1450.         tst.l    d0
  1451.         beq.b    .exit            ; no memory!
  1452.  
  1453.         movem.l    d3-d5,(a0)        ; puddleSize, Flags,Threshold
  1454.         clr.l    12(a0)            ; no next block
  1455.         lea    24(a0),a1        ; first free location here
  1456.         move.l    a1,16(a0)
  1457.         subi.l    #24,d3            ; for header info
  1458.         move.l    d3,20(a0)        ; amount free in this block
  1459.  
  1460. .exit        movem.l    (sp)+,d2-d7/a2-a6
  1461.         rts
  1462.  
  1463.         cnop    0,4
  1464.  
  1465. DeletePool    movea.l    _ExecBase,a1
  1466.         cmpi.w    #39,LIB_VERSION(a1)
  1467.         blt.b    .nopools        ; change to bra for debugging
  1468.  
  1469.         move.l    a6,-(sp)
  1470.         movea.l    a1,a6
  1471.         CALLSYS    DeletePool
  1472.         movea.l    (sp)+,a6
  1473.         rts
  1474.  
  1475. .nopools    movem.l    d2-d7/a2-a6,-(sp)
  1476.         move.l    a0,d2            ; first block
  1477.         beq.b    .exit            ; safety check
  1478.  
  1479.         movea.l    a1,a6
  1480.  
  1481. .loop        movea.l    d2,a1            ; pointer to block
  1482.         move.l    (a1),d0            ; size of block
  1483.         move.l    12(a1),d2        ; next block
  1484.         CALLSYS    FreeMem
  1485.         tst.l    d2
  1486.         bne.b    .loop
  1487.  
  1488. .exit        movem.l    (sp)+,d2-d7/a2-a6
  1489.         rts
  1490.  
  1491.         cnop    0,4
  1492.  
  1493. AllocPooled    movea.l    _ExecBase,a1
  1494.         cmpi.w    #39,LIB_VERSION(a1)
  1495.         blt.b    .nopools        ; change to bra for debugging
  1496.  
  1497.         move.l    a6,-(sp)
  1498.         movea.l    a1,a6
  1499.         CALLSYS    AllocPooled
  1500.         movea.l    (sp)+,a6
  1501.         rts
  1502.  
  1503. .nopools    movem.l    d2-d7/a2-a6,-(sp)
  1504.         move.l    a0,d2
  1505.         beq.b    .exit            ; safety check
  1506.  
  1507.         addq.l    #3,d0
  1508.         andi.b    #$FC,d0            ; long align size
  1509.  
  1510.         movea.l    a1,a6
  1511.  
  1512.         cmp.l    8(a0),d0        ; check threshold
  1513.         blt.b    .chkpuddles        ; allocate from puddles
  1514.  
  1515.         addi.l    #24,d0            ; for header
  1516.         move.l    d0,d3            ; save size
  1517.         move.l    4(a0),d1        ; mem attrs
  1518.         CALLSYS    AllocMem
  1519.         movea.l    d0,a0
  1520.         tst.l    d0
  1521.         beq.b    .exit            ; no memory
  1522.  
  1523.         move.l    d3,(a0)            ; size of block
  1524.         clr.l    20(a0)            ; no free space in here
  1525.  
  1526.         movea.l    d2,a1            ; pool header
  1527.         move.l    12(a1),d1
  1528.         move.l    a0,12(a1)        ; splice in block
  1529.         move.l    d1,12(a0)        ; relink next block
  1530.         lea    24(a0),a0        ; skip over header
  1531.  
  1532. .exit        move.l    a0,d0
  1533.         movem.l    (sp)+,d2-d7/a2-a6
  1534.         rts
  1535.  
  1536.         cnop    0,4
  1537.  
  1538. .chkpuddles    cmp.l    20(a0),d0        ; check free space
  1539.         blt.b    .gotspace
  1540.  
  1541.         movea.l    12(a0),a0        ; next block
  1542.         move.l    a0,d1
  1543.         bne.b    .chkpuddles
  1544.  
  1545. ; not enough free space in existing puddles, create another
  1546.  
  1547.         move.l    d0,d6            ; save size
  1548.  
  1549.         movea.l    d2,a0            ; pool header
  1550.         movem.l    (a0),d3-d5
  1551.         movem.l    (a0),d0-d1
  1552.         CALLSYS    AllocMem        ; get block
  1553.         movea.l    d0,a0
  1554.         tst.l    d0
  1555.         beq.b    .out            ; no memory!
  1556.  
  1557.         movea.l    d2,a1            ; pool header
  1558.         movem.l    d3-d5,(a0)        ; puddleSize, Flags,Threshold
  1559.         move.l    12(a1),12(a0)        ; next block
  1560.         move.l    a0,12(a1)        ; splice in block
  1561.         lea    24(a0),a1        ; first free location here
  1562.         move.l    a1,16(a0)
  1563.         subi.l    #24,d3            ; for header info
  1564.         move.l    d3,20(a0)        ; amount free in this block
  1565.  
  1566.         move.l    d6,d0            ; restore size
  1567.  
  1568. .gotspace    sub.l    d0,20(a0)        ; sub from amount free
  1569.         bmi.b    .err            ; threshold >= puddlesize!
  1570.  
  1571.         move.l    16(a0),a1        ; free space
  1572.         add.l    d0,16(a0)        ; next free space
  1573.  
  1574.         movea.l    a1,a0
  1575.         bra.b    .out
  1576.  
  1577. .err        add.l    d0,20(a0)        ; restore free space
  1578.         moveq    #0,d0
  1579.         suba.l    a0,a0            ; no memory
  1580.  
  1581. .out        move.l    a0,d0
  1582.         movem.l    (sp)+,d2-d7/a2-a6
  1583.         rts
  1584.  
  1585. ;------------------------------------------------------------------------
  1586. ;------------------------------------------------------------------------
  1587.  
  1588.         cnop    0,4
  1589.  
  1590. MUSMemPtr    dc.l    0
  1591. MUSMemSize    dc.l    0
  1592.  
  1593. SegList        dc.l    0
  1594. _ExecBase    dc.l    0
  1595. _DOSBase    dc.l    0
  1596. LookupMem    dc.l    0
  1597. vol_lookup    dc.l    0
  1598.  
  1599. ;------------------------------------------------------------------------
  1600.  
  1601. period        dc.w    325    ; NTSC 11025 KHz
  1602. sfx_volume    dc.w    64
  1603. mus_volume    dc.w    64
  1604. mus_playing    dc.b    0
  1605. mus_looping    dc.b    0
  1606.  
  1607. ;------------------------------------------------------------------------
  1608.  
  1609.         cnop    0,4
  1610.  
  1611. AudioPort    dc.l    0
  1612. AudioIO        dc.l    0
  1613.  
  1614. AInt0        dc.l    0,0
  1615.         dc.b    NT_INTERRUPT,0        ; LN_TYPE, LN_PRI
  1616.         dc.l    AIntName        ; LN_NAME
  1617.         dc.l    0            ; IS_DATA
  1618.         dc.l    AudioINT0        ; IS_CODE
  1619.  
  1620. MusPtr        dc.l    0
  1621. MusIndex    dc.l    0
  1622. MusDelay    dc.l    0
  1623. OldAInt0    dc.l    0
  1624.  
  1625. AudioAlloc    dc.b    $0F            ; Amiga channels to allocate
  1626.  
  1627. GfxName        dc.b    'graphics.library',0
  1628. DOSName        dc.b    'dos.library',0
  1629. AudioName    dc.b    'audio.device',0
  1630. AIntName    dc.b    'DOOM Sound Server',0
  1631.  
  1632. ;--------------------------------------
  1633.  
  1634.         CNOP    0,4
  1635.  
  1636. ; bit set if voice is in use (0-15=music voices,16-31=sfx voices)
  1637.  
  1638. VoiceAvail    dc.l    0
  1639.  
  1640. chip_buffer    dc.l    chipBuffer
  1641. chip_offset    dc.l    512
  1642.  
  1643. ;--------------------------------------------------------------------
  1644.  
  1645.         CNOP    0,4
  1646.  
  1647. NoteTable    dc.l    65536/64,69433/64,73562/64,77936/64,82570/64,87480/64,92682/64,98193/64,104032/64,110218/64,116772/64,123715/64
  1648.         dc.l    65536/32,69433/32,73562/32,77936/32,82570/32,87480/32,92682/32,98193/32,104032/32,110218/32,116772/32,123715/32
  1649.         dc.l    65536/16,69433/16,73562/16,77936/16,82570/16,87480/16,92682/16,98193/16,104032/16,110218/16,116772/16,123715/16
  1650.         dc.l    65536/8,69433/8,73562/8,77936/8,82570/8,87480/8,92682/8,98193/8,104032/8,110218/8,116772/8,123715/8
  1651.         dc.l    65536/4,69433/4,73562/4,77936/4,82570/4,87480/4,92682/4,98193/4,104032/4,110218/4,116772/4,123715/4
  1652.         dc.l    65536/2,69433/2,73562/2,77936/2,82570/2,87480/2,92682/2,98193/2,104032/2,110218/2,116772/2,123715/2
  1653.         dc.l    65536,69433,73562,77936,82570,87480,92682,98193,104032,110218,116772,123715
  1654.         dc.l    65536*2,69433*2,73562*2,77936*2,82570*2,87480*2,92682*2,98193*2,104032*2,110218*2,116772*2,123715*2
  1655.         dc.l    65536*4,69433*4,73562*4,77936*4,82570*4,87480*4,92682*4,98193*4,104032*4,110218*4,116772*4,123715*4
  1656.         dc.l    65536*8,69433*8,73562*8,77936*8,82570*8,87480*8,92682*8,98193*8,104032*8,110218*8,116772*8,123715*8
  1657.         dc.l    65536*16,69433*16,73562*16,77936*16,82570*16,87480*16,92682*16,98193*16
  1658.  
  1659. ;------------------------------------------------------------------------
  1660.  
  1661. PitchTable:
  1662.  
  1663. pitch_ix    SET    128
  1664.  
  1665.         REPT    128
  1666.         dc.l    -3678*pitch_ix/64
  1667. pitch_ix    SET    pitch_ix-1
  1668.         ENDR
  1669.  
  1670.         REPT    128
  1671.         dc.l    3897*pitch_ix/64
  1672. pitch_ix    SET    pitch_ix+1
  1673.         ENDR
  1674.  
  1675. ;------------------------------------------------------------------------
  1676.  
  1677.         STRUCTURE MusChannel,0
  1678.         APTR    ch_Instr
  1679.         APTR    ch_Map
  1680.         ULONG    ch_Pitch
  1681.         APTR    ch_LtVol
  1682.         APTR    ch_RtVol
  1683.         BYTE    ch_Vol
  1684.         BYTE    ch_Pan
  1685.  
  1686.  
  1687.         CNOP    0,4
  1688.  
  1689. Channels    dc.l    Channel0,Channel1,Channel2,Channel3
  1690.         dc.l    Channel4,Channel5,Channel6,Channel7
  1691.         dc.l    Channel8,Channel9,Channel10,Channel11
  1692.         dc.l    Channel12,Channel13,Channel14,Channel15
  1693.  
  1694.  
  1695.         CNOP    0,4
  1696.  
  1697. Channel0    dc.l    0        ; instrument
  1698.         dc.l    Channel0Map    ; note to voice map
  1699.         dc.l    0        ; pitch wheel setting
  1700.         dc.l    0        ; left volume table
  1701.         dc.l    0        ; right volume table
  1702.         dc.b    0        ; volume
  1703.         dc.b    0        ; pan setting
  1704.  
  1705.         CNOP    0,4
  1706.  
  1707. Channel1    dc.l    0        ; instrument
  1708.         dc.l    Channel1Map    ; note to voice map
  1709.         dc.l    0        ; pitch wheel setting
  1710.         dc.l    0        ; left volume table
  1711.         dc.l    0        ; right volume table
  1712.         dc.b    0        ; volume
  1713.         dc.b    0        ; pan setting
  1714.  
  1715.         CNOP    0,4
  1716.  
  1717. Channel2    dc.l    0        ; instrument
  1718.         dc.l    Channel2Map    ; note to voice map
  1719.         dc.l    0        ; pitch wheel setting
  1720.         dc.l    0        ; left volume table
  1721.         dc.l    0        ; right volume table
  1722.         dc.b    0        ; volume
  1723.         dc.b    0        ; pan setting
  1724.  
  1725.         CNOP    0,4
  1726.  
  1727. Channel3    dc.l    0        ; instrument
  1728.         dc.l    Channel3Map    ; note to voice map
  1729.         dc.l    0        ; pitch wheel setting
  1730.         dc.l    0        ; left volume table
  1731.         dc.l    0        ; right volume table
  1732.         dc.b    0        ; volume
  1733.         dc.b    0        ; pan setting
  1734.  
  1735.         CNOP    0,4
  1736.  
  1737. Channel4    dc.l    0        ; instrument
  1738.         dc.l    Channel4Map    ; note to voice map
  1739.         dc.l    0        ; pitch wheel setting
  1740.         dc.l    0        ; left volume table
  1741.         dc.l    0        ; right volume table
  1742.         dc.b    0        ; volume
  1743.         dc.b    0        ; pan setting
  1744.  
  1745.         CNOP    0,4
  1746.  
  1747. Channel5    dc.l    0        ; instrument
  1748.         dc.l    Channel5Map    ; note to voice map
  1749.         dc.l    0        ; pitch wheel setting
  1750.         dc.l    0        ; left volume table
  1751.         dc.l    0        ; right volume table
  1752.         dc.b    0        ; volume
  1753.         dc.b    0        ; pan setting
  1754.  
  1755.         CNOP    0,4
  1756.  
  1757. Channel6    dc.l    0        ; instrument
  1758.         dc.l    Channel6Map    ; note to voice map
  1759.         dc.l    0        ; pitch wheel setting
  1760.         dc.l    0        ; left volume table
  1761.         dc.l    0        ; right volume table
  1762.         dc.b    0        ; volume
  1763.         dc.b    0        ; pan setting
  1764.  
  1765.         CNOP    0,4
  1766.  
  1767. Channel7    dc.l    0        ; instrument
  1768.         dc.l    Channel7Map    ; note to voice map
  1769.         dc.l    0        ; pitch wheel setting
  1770.         dc.l    0        ; left volume table
  1771.         dc.l    0        ; right volume table
  1772.         dc.b    0        ; volume
  1773.         dc.b    0        ; pan setting
  1774.  
  1775.         CNOP    0,4
  1776.  
  1777. Channel8    dc.l    0        ; instrument
  1778.         dc.l    Channel8Map    ; note to voice map
  1779.         dc.l    0        ; pitch wheel setting
  1780.         dc.l    0        ; left volume table
  1781.         dc.l    0        ; right volume table
  1782.         dc.b    0        ; volume
  1783.         dc.b    0        ; pan setting
  1784.  
  1785.         CNOP    0,4
  1786.  
  1787. Channel9    dc.l    0        ; instrument
  1788.         dc.l    Channel9Map    ; note to voice map
  1789.         dc.l    0        ; pitch wheel setting
  1790.         dc.l    0        ; left volume table
  1791.         dc.l    0        ; right volume table
  1792.         dc.b    0        ; volume
  1793.         dc.b    0        ; pan setting
  1794.  
  1795.         CNOP    0,4
  1796.  
  1797. Channel10    dc.l    0        ; instrument
  1798.         dc.l    Channel10Map    ; note to voice map
  1799.         dc.l    0        ; pitch wheel setting
  1800.         dc.l    0        ; left volume table
  1801.         dc.l    0        ; right volume table
  1802.         dc.b    0        ; volume
  1803.         dc.b    0        ; pan setting
  1804.  
  1805.         CNOP    0,4
  1806.  
  1807. Channel11    dc.l    0        ; instrument
  1808.         dc.l    Channel11Map    ; note to voice map
  1809.         dc.l    0        ; pitch wheel setting
  1810.         dc.l    0        ; left volume table
  1811.         dc.l    0        ; right volume table
  1812.         dc.b    0        ; volume
  1813.         dc.b    0        ; pan setting
  1814.  
  1815.         CNOP    0,4
  1816.  
  1817. Channel12    dc.l    0        ; instrument
  1818.         dc.l    Channel12Map    ; note to voice map
  1819.         dc.l    0        ; pitch wheel setting
  1820.         dc.l    0        ; left volume table
  1821.         dc.l    0        ; right volume table
  1822.         dc.b    0        ; volume
  1823.         dc.b    0        ; pan setting
  1824.  
  1825.         CNOP    0,4
  1826.  
  1827. Channel13    dc.l    0        ; instrument
  1828.         dc.l    Channel13Map    ; note to voice map
  1829.         dc.l    0        ; pitch wheel setting
  1830.         dc.l    0        ; left volume table
  1831.         dc.l    0        ; right volume table
  1832.         dc.b    0        ; volume
  1833.         dc.b    0        ; pan setting
  1834.  
  1835.         CNOP    0,4
  1836.  
  1837. Channel14    dc.l    0        ; instrument
  1838.         dc.l    Channel14Map    ; note to voice map
  1839.         dc.l    0        ; pitch wheel setting
  1840.         dc.l    0        ; left volume table
  1841.         dc.l    0        ; right volume table
  1842.         dc.b    0        ; volume
  1843.         dc.b    0        ; pan setting
  1844.  
  1845.         CNOP    0,4
  1846.  
  1847. Channel15    dc.l    0        ; instrument
  1848.         dc.l    Channel15Map    ; note to voice map
  1849.         dc.l    0        ; pitch wheel setting
  1850.         dc.l    0        ; left volume table
  1851.         dc.l    0        ; right volume table
  1852.         dc.b    0        ; volume
  1853.         dc.b    0        ; pan setting
  1854.  
  1855.  
  1856.         CNOP    0,4
  1857.  
  1858. Channel0Map    dcb.b    128,0
  1859. Channel1Map    dcb.b    128,0
  1860. Channel2Map    dcb.b    128,0
  1861. Channel3Map    dcb.b    128,0
  1862. Channel4Map    dcb.b    128,0
  1863. Channel5Map    dcb.b    128,0
  1864. Channel6Map    dcb.b    128,0
  1865. Channel7Map    dcb.b    128,0
  1866. Channel8Map    dcb.b    128,0
  1867. Channel9Map    dcb.b    128,0
  1868. Channel10Map    dcb.b    128,0
  1869. Channel11Map    dcb.b    128,0
  1870. Channel12Map    dcb.b    128,0
  1871. Channel13Map    dcb.b    128,0
  1872. Channel14Map    dcb.b    128,0
  1873. Channel15Map    dcb.b    128,0
  1874.  
  1875. ;--------------------------------------
  1876.  
  1877.         STRUCTURE AudioVoice,0
  1878.         APTR    vc_Next
  1879.         APTR    vc_Channel
  1880.         APTR    vc_Wave
  1881.         ULONG    vc_Index
  1882.         ULONG    vc_Step
  1883.         ULONG    vc_Loop
  1884.         ULONG    vc_Length
  1885.         APTR    vc_LtVol
  1886.         APTR    vc_RtVol
  1887.         BYTE    vc_Flags    ; b7 = SFX, b1 = RLS, b0 = EN
  1888.  
  1889.         CNOP    0,4
  1890.  
  1891. Voices        dc.l    Voice0,Voice1,Voice2,Voice3
  1892.         dc.l    Voice4,Voice5,Voice6,Voice7
  1893.         dc.l    Voice8,Voice9,Voice10,Voice11
  1894.         dc.l    Voice12,Voice13,Voice14,Voice15
  1895.  
  1896. sfxVoiceTbl    dc.l    Voice16,Voice17,Voice18,Voice19
  1897.         dc.l    Voice20,Voice21,Voice22,Voice23
  1898.         dc.l    Voice24,Voice25,Voice26,Voice27
  1899.         dc.l    Voice28,Voice29,Voice30,Voice31
  1900.  
  1901. ; Music Voices
  1902.  
  1903.         CNOP    0,4
  1904.  
  1905. Voice0        dc.l    Voice1
  1906.         dc.l    0        ; channel back-link
  1907.         dc.l    0        ; instrument wave data
  1908.         dc.l    0        ; sample index
  1909.         dc.l    0        ; sample rate
  1910.         dc.l    0        ; instrument loop point
  1911.         dc.l    0        ; instrument data length
  1912.         dc.l    0        ; left volume table
  1913.         dc.l    0        ; right volume table
  1914.         dc.b    0        ; voice flags
  1915.  
  1916.         CNOP    0,4
  1917.  
  1918. Voice1        dc.l    Voice2
  1919.         dc.l    0        ; channel back-link
  1920.         dc.l    0        ; instrument wave data
  1921.         dc.l    0        ; sample index
  1922.         dc.l    0        ; sample rate
  1923.         dc.l    0        ; instrument loop point
  1924.         dc.l    0        ; instrument data length
  1925.         dc.l    0        ; left volume table
  1926.         dc.l    0        ; right volume table
  1927.         dc.b    0        ; voice flags
  1928.  
  1929.         CNOP    0,4
  1930.  
  1931. Voice2        dc.l    Voice3
  1932.         dc.l    0        ; channel back-link
  1933.         dc.l    0        ; instrument wave data
  1934.         dc.l    0        ; sample index
  1935.         dc.l    0        ; sample rate
  1936.         dc.l    0        ; instrument loop point
  1937.         dc.l    0        ; instrument data length
  1938.         dc.l    0        ; left volume table
  1939.         dc.l    0        ; right volume table
  1940.         dc.b    0        ; voice flags
  1941.  
  1942.         CNOP    0,4
  1943.  
  1944. Voice3        dc.l    Voice4
  1945.         dc.l    0        ; channel back-link
  1946.         dc.l    0        ; instrument wave data
  1947.         dc.l    0        ; sample index
  1948.         dc.l    0        ; sample rate
  1949.         dc.l    0        ; instrument loop point
  1950.         dc.l    0        ; instrument data length
  1951.         dc.l    0        ; left volume table
  1952.         dc.l    0        ; right volume table
  1953.         dc.b    0        ; voice flags
  1954.  
  1955.         CNOP    0,4
  1956.  
  1957. Voice4        dc.l    Voice5
  1958.         dc.l    0        ; channel back-link
  1959.         dc.l    0        ; instrument wave data
  1960.         dc.l    0        ; sample index
  1961.         dc.l    0        ; sample rate
  1962.         dc.l    0        ; instrument loop point
  1963.         dc.l    0        ; instrument data length
  1964.         dc.l    0        ; left volume table
  1965.         dc.l    0        ; right volume table
  1966.         dc.b    0        ; voice flags
  1967.  
  1968.         CNOP    0,4
  1969.  
  1970. Voice5        dc.l    Voice6
  1971.         dc.l    0        ; channel back-link
  1972.         dc.l    0        ; instrument wave data
  1973.         dc.l    0        ; sample index
  1974.         dc.l    0        ; sample rate
  1975.         dc.l    0        ; instrument loop point
  1976.         dc.l    0        ; instrument data length
  1977.         dc.l    0        ; left volume table
  1978.         dc.l    0        ; right volume table
  1979.         dc.b    0        ; voice flags
  1980.  
  1981.         CNOP    0,4
  1982.  
  1983. Voice6        dc.l    Voice7
  1984.         dc.l    0        ; channel back-link
  1985.         dc.l    0        ; instrument wave data
  1986.         dc.l    0        ; sample index
  1987.         dc.l    0        ; sample rate
  1988.         dc.l    0        ; instrument loop point
  1989.         dc.l    0        ; instrument data length
  1990.         dc.l    0        ; left volume table
  1991.         dc.l    0        ; right volume table
  1992.         dc.b    0        ; voice flags
  1993.  
  1994.         CNOP    0,4
  1995.  
  1996. Voice7        dc.l    Voice8
  1997.         dc.l    0        ; channel back-link
  1998.         dc.l    0        ; instrument wave data
  1999.         dc.l    0        ; sample index
  2000.         dc.l    0        ; sample rate
  2001.         dc.l    0        ; instrument loop point
  2002.         dc.l    0        ; instrument data length
  2003.         dc.l    0        ; left volume table
  2004.         dc.l    0        ; right volume table
  2005.         dc.b    0        ; voice flags
  2006.  
  2007.         CNOP    0,4
  2008.  
  2009. Voice8        dc.l    Voice9
  2010.         dc.l    0        ; channel back-link
  2011.         dc.l    0        ; instrument wave data
  2012.         dc.l    0        ; sample index
  2013.         dc.l    0        ; sample rate
  2014.         dc.l    0        ; instrument loop point
  2015.         dc.l    0        ; instrument data length
  2016.         dc.l    0        ; left volume table
  2017.         dc.l    0        ; right volume table
  2018.         dc.b    0        ; voice flags
  2019.  
  2020.         CNOP    0,4
  2021.  
  2022. Voice9        dc.l    Voice10
  2023.         dc.l    0        ; channel back-link
  2024.         dc.l    0        ; instrument wave data
  2025.         dc.l    0        ; sample index
  2026.         dc.l    0        ; sample rate
  2027.         dc.l    0        ; instrument loop point
  2028.         dc.l    0        ; instrument data length
  2029.         dc.l    0        ; left volume table
  2030.         dc.l    0        ; right volume table
  2031.         dc.b    0        ; voice flags
  2032.  
  2033.         CNOP    0,4
  2034.  
  2035. Voice10        dc.l    Voice11
  2036.         dc.l    0        ; channel back-link
  2037.         dc.l    0        ; instrument wave data
  2038.         dc.l    0        ; sample index
  2039.         dc.l    0        ; sample rate
  2040.         dc.l    0        ; instrument loop point
  2041.         dc.l    0        ; instrument data length
  2042.         dc.l    0        ; left volume table
  2043.         dc.l    0        ; right volume table
  2044.         dc.b    0        ; voice flags
  2045.  
  2046.         CNOP    0,4
  2047.  
  2048. Voice11        dc.l    Voice12
  2049.         dc.l    0        ; channel back-link
  2050.         dc.l    0        ; instrument wave data
  2051.         dc.l    0        ; sample index
  2052.         dc.l    0        ; sample rate
  2053.         dc.l    0        ; instrument loop point
  2054.         dc.l    0        ; instrument data length
  2055.         dc.l    0        ; left volume table
  2056.         dc.l    0        ; right volume table
  2057.         dc.b    0        ; voice flags
  2058.  
  2059.         CNOP    0,4
  2060.  
  2061. Voice12        dc.l    Voice13
  2062.         dc.l    0        ; channel back-link
  2063.         dc.l    0        ; instrument wave data
  2064.         dc.l    0        ; sample index
  2065.         dc.l    0        ; sample rate
  2066.         dc.l    0        ; instrument loop point
  2067.         dc.l    0        ; instrument data length
  2068.         dc.l    0        ; left volume table
  2069.         dc.l    0        ; right volume table
  2070.         dc.b    0        ; voice flags
  2071.  
  2072.         CNOP    0,4
  2073.  
  2074. Voice13        dc.l    Voice14
  2075.         dc.l    0        ; channel back-link
  2076.         dc.l    0        ; instrument wave data
  2077.         dc.l    0        ; sample index
  2078.         dc.l    0        ; sample rate
  2079.         dc.l    0        ; instrument loop point
  2080.         dc.l    0        ; instrument data length
  2081.         dc.l    0        ; left volume table
  2082.         dc.l    0        ; right volume table
  2083.         dc.b    0        ; voice flags
  2084.  
  2085.         CNOP    0,4
  2086.  
  2087. Voice14        dc.l    Voice15
  2088.         dc.l    0        ; channel back-link
  2089.         dc.l    0        ; instrument wave data
  2090.         dc.l    0        ; sample index
  2091.         dc.l    0        ; sample rate
  2092.         dc.l    0        ; instrument loop point
  2093.         dc.l    0        ; instrument data length
  2094.         dc.l    0        ; left volume table
  2095.         dc.l    0        ; right volume table
  2096.         dc.b    0        ; voice flags
  2097.  
  2098.         CNOP    0,4
  2099.  
  2100. Voice15        dc.l    0
  2101.         dc.l    0        ; channel back-link
  2102.         dc.l    0        ; instrument wave data
  2103.         dc.l    0        ; sample index
  2104.         dc.l    0        ; sample rate
  2105.         dc.l    0        ; instrument loop point
  2106.         dc.l    0        ; instrument data length
  2107.         dc.l    0        ; left volume table
  2108.         dc.l    0        ; right volume table
  2109.         dc.b    0        ; voice flags
  2110.  
  2111. ; Sound Effect Voices
  2112.  
  2113.         CNOP    0,4
  2114.  
  2115. Voice16        dc.l    Voice17
  2116.         dc.l    0        ; channel back-link
  2117.         dc.l    0        ; instrument wave data
  2118.         dc.l    0        ; sample index
  2119.         dc.l    0        ; sample rate
  2120.         dc.l    0        ; instrument loop point
  2121.         dc.l    0        ; instrument data length
  2122.         dc.l    0        ; left volume table
  2123.         dc.l    0        ; right volume table
  2124.         dc.b    0        ; voice flags
  2125.  
  2126.         CNOP    0,4
  2127.  
  2128. Voice17        dc.l    Voice18
  2129.         dc.l    0        ; channel back-link
  2130.         dc.l    0        ; instrument wave data
  2131.         dc.l    0        ; sample index
  2132.         dc.l    0        ; sample rate
  2133.         dc.l    0        ; instrument loop point
  2134.         dc.l    0        ; instrument data length
  2135.         dc.l    0        ; left volume table
  2136.         dc.l    0        ; right volume table
  2137.         dc.b    0        ; voice flags
  2138.  
  2139.         CNOP    0,4
  2140.  
  2141. Voice18        dc.l    Voice19
  2142.         dc.l    0        ; channel back-link
  2143.         dc.l    0        ; instrument wave data
  2144.         dc.l    0        ; sample index
  2145.         dc.l    0        ; sample rate
  2146.         dc.l    0        ; instrument loop point
  2147.         dc.l    0        ; instrument data length
  2148.         dc.l    0        ; left volume table
  2149.         dc.l    0        ; right volume table
  2150.         dc.b    0        ; voice flags
  2151.  
  2152.         CNOP    0,4
  2153.  
  2154. Voice19        dc.l    Voice20
  2155.         dc.l    0        ; channel back-link
  2156.         dc.l    0        ; instrument wave data
  2157.         dc.l    0        ; sample index
  2158.         dc.l    0        ; sample rate
  2159.         dc.l    0        ; instrument loop point
  2160.         dc.l    0        ; instrument data length
  2161.         dc.l    0        ; left volume table
  2162.         dc.l    0        ; right volume table
  2163.         dc.b    0        ; voice flags
  2164.  
  2165.         CNOP    0,4
  2166.  
  2167. Voice20        dc.l    Voice21
  2168.         dc.l    0        ; channel back-link
  2169.         dc.l    0        ; instrument wave data
  2170.         dc.l    0        ; sample index
  2171.         dc.l    0        ; sample rate
  2172.         dc.l    0        ; instrument loop point
  2173.         dc.l    0        ; instrument data length
  2174.         dc.l    0        ; left volume table
  2175.         dc.l    0        ; right volume table
  2176.         dc.b    0        ; voice flags
  2177.  
  2178.         CNOP    0,4
  2179.  
  2180. Voice21        dc.l    Voice22
  2181.         dc.l    0        ; channel back-link
  2182.         dc.l    0        ; instrument wave data
  2183.         dc.l    0        ; sample index
  2184.         dc.l    0        ; sample rate
  2185.         dc.l    0        ; instrument loop point
  2186.         dc.l    0        ; instrument data length
  2187.         dc.l    0        ; left volume table
  2188.         dc.l    0        ; right volume table
  2189.         dc.b    0        ; voice flags
  2190.  
  2191.         CNOP    0,4
  2192.  
  2193. Voice22        dc.l    Voice23
  2194.         dc.l    0        ; channel back-link
  2195.         dc.l    0        ; instrument wave data
  2196.         dc.l    0        ; sample index
  2197.         dc.l    0        ; sample rate
  2198.         dc.l    0        ; instrument loop point
  2199.         dc.l    0        ; instrument data length
  2200.         dc.l    0        ; left volume table
  2201.         dc.l    0        ; right volume table
  2202.         dc.b    0        ; voice flags
  2203.  
  2204.         CNOP    0,4
  2205.  
  2206. Voice23        dc.l    Voice24
  2207.         dc.l    0        ; channel back-link
  2208.         dc.l    0        ; instrument wave data
  2209.         dc.l    0        ; sample index
  2210.         dc.l    0        ; sample rate
  2211.         dc.l    0        ; instrument loop point
  2212.         dc.l    0        ; instrument data length
  2213.         dc.l    0        ; left volume table
  2214.         dc.l    0        ; right volume table
  2215.         dc.b    0        ; voice flags
  2216.  
  2217.         CNOP    0,4
  2218.  
  2219. Voice24        dc.l    Voice25
  2220.         dc.l    0        ; channel back-link
  2221.         dc.l    0        ; instrument wave data
  2222.         dc.l    0        ; sample index
  2223.         dc.l    0        ; sample rate
  2224.         dc.l    0        ; instrument loop point
  2225.         dc.l    0        ; instrument data length
  2226.         dc.l    0        ; left volume table
  2227.         dc.l    0        ; right volume table
  2228.         dc.b    0        ; voice flags
  2229.  
  2230.         CNOP    0,4
  2231.  
  2232. Voice25        dc.l    Voice26
  2233.         dc.l    0        ; channel back-link
  2234.         dc.l    0        ; instrument wave data
  2235.         dc.l    0        ; sample index
  2236.         dc.l    0        ; sample rate
  2237.         dc.l    0        ; instrument loop point
  2238.         dc.l    0        ; instrument data length
  2239.         dc.l    0        ; left volume table
  2240.         dc.l    0        ; right volume table
  2241.         dc.b    0        ; voice flags
  2242.  
  2243.         CNOP    0,4
  2244.  
  2245. Voice26        dc.l    Voice27
  2246.         dc.l    0        ; channel back-link
  2247.         dc.l    0        ; instrument wave data
  2248.         dc.l    0        ; sample index
  2249.         dc.l    0        ; sample rate
  2250.         dc.l    0        ; instrument loop point
  2251.         dc.l    0        ; instrument data length
  2252.         dc.l    0        ; left volume table
  2253.         dc.l    0        ; right volume table
  2254.         dc.b    0        ; voice flags
  2255.  
  2256.         CNOP    0,4
  2257.  
  2258. Voice27        dc.l    Voice28
  2259.         dc.l    0        ; channel back-link
  2260.         dc.l    0        ; instrument wave data
  2261.         dc.l    0        ; sample index
  2262.         dc.l    0        ; sample rate
  2263.         dc.l    0        ; instrument loop point
  2264.         dc.l    0        ; instrument data length
  2265.         dc.l    0        ; left volume table
  2266.         dc.l    0        ; right volume table
  2267.         dc.b    0        ; voice flags
  2268.  
  2269.         CNOP    0,4
  2270.  
  2271. Voice28        dc.l    Voice29
  2272.         dc.l    0        ; channel back-link
  2273.         dc.l    0        ; instrument wave data
  2274.         dc.l    0        ; sample index
  2275.         dc.l    0        ; sample rate
  2276.         dc.l    0        ; instrument loop point
  2277.         dc.l    0        ; instrument data length
  2278.         dc.l    0        ; left volume table
  2279.         dc.l    0        ; right volume table
  2280.         dc.b    0        ; voice flags
  2281.  
  2282.         CNOP    0,4
  2283.  
  2284. Voice29        dc.l    Voice30
  2285.         dc.l    0        ; channel back-link
  2286.         dc.l    0        ; instrument wave data
  2287.         dc.l    0        ; sample index
  2288.         dc.l    0        ; sample rate
  2289.         dc.l    0        ; instrument loop point
  2290.         dc.l    0        ; instrument data length
  2291.         dc.l    0        ; left volume table
  2292.         dc.l    0        ; right volume table
  2293.         dc.b    0        ; voice flags
  2294.  
  2295.         CNOP    0,4
  2296.  
  2297. Voice30        dc.l    Voice31
  2298.         dc.l    0        ; channel back-link
  2299.         dc.l    0        ; instrument wave data
  2300.         dc.l    0        ; sample index
  2301.         dc.l    0        ; sample rate
  2302.         dc.l    0        ; instrument loop point
  2303.         dc.l    0        ; instrument data length
  2304.         dc.l    0        ; left volume table
  2305.         dc.l    0        ; right volume table
  2306.         dc.b    0        ; voice flags
  2307.  
  2308.         CNOP    0,4
  2309.  
  2310. Voice31        dc.l    0
  2311.         dc.l    0        ; channel back-link
  2312.         dc.l    0        ; instrument wave data
  2313.         dc.l    0        ; sample index
  2314.         dc.l    0        ; sample rate
  2315.         dc.l    0        ; instrument loop point
  2316.         dc.l    0        ; instrument data length
  2317.         dc.l    0        ; left volume table
  2318.         dc.l    0        ; right volume table
  2319.         dc.b    0        ; voice flags
  2320.  
  2321. ;--------------------------------------
  2322.  
  2323.         STRUCTURE InstrumentRec,0
  2324.         APTR    in_Wave
  2325.         ULONG    in_Loop
  2326.         ULONG    in_Length
  2327.         BYTE    in_Flags
  2328.         BYTE    in_Base
  2329.  
  2330.  
  2331.         CNOP    0,4
  2332.  
  2333. Instruments    dcb.l    256,0
  2334.  
  2335.         CNOP    0,4
  2336.  
  2337. QuietInst    dc.l    0
  2338.         dc.l    0
  2339.         dc.l    0
  2340.         dc.b    0
  2341.         dc.b    0
  2342.  
  2343.  
  2344.         CNOP    0,4
  2345.  
  2346. InstrHandle    dc.l    0
  2347. InstrFile    dc.l    InstrName
  2348. InstrPool    dc.l    0
  2349.  
  2350. InstrName    dc.b    'MIDI_Instruments',0
  2351.  
  2352.         CNOP    0,4
  2353.  
  2354. validInstr    dc.b    %11111111    ; (00-07) Piano
  2355.         dc.b    %11111111    ; (08-0F) Chrom Perc
  2356.         dc.b    %11111111    ; (10-17) Organ
  2357.         dc.b    %11111111    ; (18-1F) Guitar
  2358.         dc.b    %11111111    ; (20-27) Bass
  2359.         dc.b    %11111111    ; (28-2F) Strings
  2360.         dc.b    %11111111    ; (30-37) Ensemble
  2361.         dc.b    %11111111    ; (38-3F) Brass
  2362.         dc.b    %11111111    ; (40-47) Reed
  2363.         dc.b    %11111111    ; (48-4F) Pipe
  2364.         dc.b    %11111111    ; (50-57) Synth Lead
  2365.         dc.b    %11111111    ; (58-5F) Synth Pad
  2366.         dc.b    %11111111    ; (60-67) Synth Effects
  2367.         dc.b    %11111111    ; (68-6F) Ethnic
  2368.         dc.b    %11111111    ; (70-77) Percussive
  2369.         dc.b    %11111111    ; (78-7F) SFX
  2370.         dc.b    %00000001    ; (80-87) invalid,Drum
  2371.         dc.b    %11111111    ; (88-8F) Drums/Clap/Hi-Hat
  2372.         dc.b    %11111111    ; (90-97) Hi-Hats/Toms/Cymb1
  2373.         dc.b    %11111111    ; (98-9F) Cymbals/Bells/Slap
  2374.         dc.b    %11111111    ; (A0-A7) Bongos/Congas/Timb
  2375.         dc.b    %11111111    ; (A8-AF) Agogo/Whistles/Gui
  2376.         dc.b    %11111100    ; (B0-B7) Claves/Block/Trian
  2377.         dc.b    %00000000    ; (B8-BF) invalid
  2378.         dc.b    %00000000    ; (C0-C7)
  2379.         dc.b    %00000000    ; (C8-CF)
  2380.         dc.b    %00000000    ; (D0-D7)
  2381.         dc.b    %00000000    ; (D8-DF)
  2382.         dc.b    %00000000    ; (E0-E7)
  2383.         dc.b    %00000000    ; (E8-EF)
  2384.         dc.b    %00000000    ; (F0-F7)
  2385.         dc.b    %00000000    ; (F8-FF)
  2386.  
  2387. ;--------------------------------------------------------------------
  2388.         section    PlayMusChip,data_c
  2389.  
  2390. chipBuffer    dcb.b    1024,0
  2391.  
  2392. ClearBuf    dcb.b    160,0
  2393.  
  2394. ;------------------------------------------------------------------------
  2395.         section    PlayMusBSS,bss
  2396.  
  2397. tempAudio    ds.b    256
  2398.  
  2399. ;------------------------------------------------------------------------
  2400.  
  2401.         end
  2402.